package com.xiaojimao.Scheduled;
import com.xiaojimao.Pojo.ArticleReadnum;
import com.xiaojimao.Service.Impl.ArticleReadnumServiceImpl;
import com.xiaojimao.Utils.ArticleConstant;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.List;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;

@Component
public class ReadNumScheduled {

    @Autowired
    StringRedisTemplate redisTemplate;

    @Autowired
    ArticleReadnumServiceImpl articleReadnumService;

    /**
     * redis统计今日阅读量并保存数据库
     */
    @Scheduled(cron = "0 0 23 * * ? ")
    public void ReadNumScheduled() {
        Set<String> keys = redisTemplate.keys(ArticleConstant.KEY_ARTICLE_READ_NUM + "*");
        HashMap<String, Integer> redNumMap = new HashMap<>();
        keys.forEach(item -> {
            // 今日阅读总量
            AtomicInteger currentNum = new AtomicInteger(0);
            // 获取这个key下所有阅读的用户key
            Set<Object> redNumKeys = redisTemplate.opsForHash().keys(item);
            redNumKeys.forEach(key -> {
                // 获得每一个用户阅读了多少次
                Integer num = (Integer) redisTemplate.opsForHash().get(item, key);
                // 进行累加
                currentNum.set(currentNum.get() + num);
            });
            // 分割返回的文章id
            String[] split = item.split(":");
            // 将文章id与文章阅读量保存
            redNumMap.put(split[2], currentNum.get());
        });

        // 获得所有key集合
        Set<String> ids = redNumMap.keySet();
        // 查询数据库当前的操作
        List<ArticleReadnum> articleReadnums = articleReadnumService.listByIds(ids);
        // 遍历查出来的数据，存在就累加，不存在就新增
        List<ArticleReadnum> collect = articleReadnums.stream().map(item -> {
            if (ids.contains(item.getArticleId())) {
                // 存在累加
                // 获得对应的阅读量
                Integer newNum = redNumMap.get(item.getArticleId());
                // 累加
                item.setNum(item.getNum() + newNum);
                return item;
            } else {
                // 不存在 新增
                ArticleReadnum readnum = new ArticleReadnum();
                readnum.setArticleId(item.getArticleId());
                // 新增
                // 获得对应的阅读量
                Integer newNum = redNumMap.get(item.getArticleId());
                // 累加
                readnum.setNum(newNum);
                return readnum;
            }
        }).collect(Collectors.toList());
        // 最后 保存数据库
        articleReadnumService.saveBatch(collect);

        // 删除今日数据
        redisTemplate.delete(keys);
    }
}
